package org.rguess.patterns.singleton;

/**
 * 类级内部类的单例模式
 * @author dview
 *
 */
public class Singleton {

	private Singleton(){};
	
	private static class SingleHolder {
		private static Singleton instance = new Singleton();
	}
	
	public static Singleton getInstance(){
		return SingleHolder.instance;
	}
	
	public static void main(String[] args) {
		Singleton1.uniqueInstance.singletonOperation();
	}
}

/**
 * 双重检查加锁
 */
class Singleton2 {
    private volatile static Singleton2 instance = null;
    private Singleton2(){}
    public static Singleton2 getInstance(){
        //先检查实例是否存在，如果不存在才进入下面的同步块
        if(instance == null){
            //同步块，线程安全的创建实例
            synchronized (Singleton.class) {
                //再次检查实例是否存在，如果不存在才真正的创建实例
                if(instance == null){
                    instance = new Singleton2();
                }
            }
        }
        return instance;
    }
}

/**
 * 枚举式单例
 * @author dview
 *
 */
enum Singleton1 {
	
    /**
     * 定义一个枚举的元素，它就代表了Singleton的一个实例。
     */
    uniqueInstance;
    
    /**
     * 单例可以有自己的操作
     */
    public void singletonOperation(){
        System.out.println("11");
    }
}